package control;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIParameter;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import model.Associado;
import model.Categoria;
import model.Formacao;
import model.Visibilidade;
import util.Convert;
import util.Cpf;
import util.Util;
import business.AssociadoDAO;

@ManagedBean(name="associadoHandler")
@SessionScoped

public class AssociadoHandler implements Serializable {
	private static final long serialVersionUID = 1L;
	private AssociadoDAO associadoDAO = AssociadoDAO.getInstance();
	private Associado associado = new Associado();
	private int categoriaSel = 1;
	private int formacaoSel = 1;
	private int visibilidadeTelRes = 0;
	private int visibilidadeTelTrab = 0;
	private int visibilidadeCel = 0;
	private int visibilidadeEmail = 0;
	private int visibilidadeEnd = 0;
	private int maxLinhas 		= 35;
	private boolean emEdicao 	= false;
	private boolean htmlTableIniciada = false;
    private String data;
    private Date dataFormatada = null;
    private Cpf cpf = new Cpf(); 
	
	public AssociadoDAO getAssociadoDAO() {
		return this.associadoDAO;
	}
	public void setAssociadoDAO(AssociadoDAO associadoDAO) {
		this.associadoDAO = associadoDAO;
	}
	public Associado getAssociado() {
		return this.associado;
	}
	public void setAssociado(Associado associado) throws Exception {
		this.associado = associado;
		setVarAssociado();
	}
	public int getCategoriaSel() {
		return this.categoriaSel;
	}
	public void setCategoriaSel(int categoriaSel) {
		this.categoriaSel = categoriaSel;
	}
	public int getFormacaoSel() {
		return this.formacaoSel;
	}
	public void setFormacaoSel(int formacaoSel) {
		this.formacaoSel = formacaoSel;
	}
	public int getVisibilidadeTelRes() {
		return this.visibilidadeTelRes;
	}
	public void setVisibilidadeTelRes(int visibilidadeTelRes) {
		this.visibilidadeTelRes = visibilidadeTelRes;
	}
	public int getVisibilidadeTelTrab() {
		return this.visibilidadeTelTrab;
	}
	public void setVisibilidadeTelTrab(int visibilidadeTelTrab) {
		this.visibilidadeTelTrab = visibilidadeTelTrab;
	}
	public int getVisibilidadeCel() {
		return this.visibilidadeCel;
	}
	public void setVisibilidadeCel(int visibilidadeCel) {
		this.visibilidadeCel = visibilidadeCel;
	}
	public int getVisibilidadeEmail() {
		return this.visibilidadeEmail;
	}
	public void setVisibilidadeEmail(int visibilidadeEmail) {
		this.visibilidadeEmail = visibilidadeEmail;
	}
	public int getVisibilidadeEnd() {
		return this.visibilidadeEnd;
	}
	public void setVisibilidadeEnd(int visibilidadeEnd) {
		this.visibilidadeEnd = visibilidadeEnd;
	}
	
	public String novo()	{
		this.associado = new Associado();
		this.dataFormatada = null;
		this.categoriaSel = 1;
		this.formacaoSel = 1;
		this.visibilidadeTelRes = 0;
		this.visibilidadeTelTrab = 0;
		this.visibilidadeCel = 0;
		this.visibilidadeEmail = 0;
		this.visibilidadeEnd = 0;
		this.emEdicao = true;
		return "associadoManter";
	}
	
	public String salvar(){
		setDadosAssociado();
		this.associadoDAO.salvar(this.associado);
		FacesContext context = FacesContext.getCurrentInstance();
		context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Dados salvos com sucesso!",""));
		this.emEdicao = false;
		return "associadoManter";
	}
	
	public void editar(ActionEvent event) throws Exception {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("editarAssociadoParam");
		this.associado = (Associado)param.getValue();
		this.emEdicao = true;
		setVarAssociado();
	}
	
	public void excluir(ActionEvent event)	{
	    UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("excluirAssociadoParam");
		Integer id = (Integer) param.getValue();
		this.associadoDAO.remover(id);
		this.associado = new Associado();
		this.emEdicao = false;
		dataFormatada = null;
	}
	
	public void atuacao(ActionEvent event) throws Exception {
		UIComponent link = event.getComponent();
		UIParameter param = (UIParameter) link.findComponent("atuacaoAssociadoParam");
		this.associado = (Associado)param.getValue();
		this.emEdicao = true;
		setVarAssociado();
	}
	
	public String sair(){
		return "menuAssociado";
	}
	
	public String listar(){
		return "associadoListar";
	}
	
	public List<Associado> getAssociados()	{
		List<Associado> listar = associadoDAO.listar();
		return listar;
	}
	
	public void receberData(ValueChangeEvent event) throws Exception {
        this.data = Convert.dateObjectToString(event.getNewValue());
	}
	
	public String getData()	{
		return this.data;
	}
	
	public void setData(String data) {
		this.data = data;
	}
	
	public void setDataFormatada(Date dataFormatada) {
		this.dataFormatada = dataFormatada;
	}
	
	public Date getDataFormatada() {
		return this.dataFormatada;
	}
	
	public List<SelectItem> getCategorias() {
		List<SelectItem> itens = new ArrayList<SelectItem>();
		
		for (Categoria item : Categoria.values()) {
			itens.add(new SelectItem(item.getCategoria(), item.getDescricao()));
		}
		return itens;
	}
	
	public List<SelectItem> getFormacoes() {
		List<SelectItem> itens = new ArrayList<SelectItem>();
		
		for (Formacao item : Formacao.values()) {
			itens.add(new SelectItem(item.getFormacao(), item.getDescricao()));
		}
		return itens;
	}
	
	public List<SelectItem> getVisibilidades() {
        List<SelectItem> itens = new ArrayList<SelectItem>();
        for (Visibilidade item : Visibilidade.values()) {
        	itens.add(new SelectItem(item.getVisibilidade(), item.getDescricao()));
        }
        return itens;
    }
	
	private void setDadosAssociado() {
		this.associado.setNascimento(this.dataFormatada);
		this.associado.setCategoria(this.categoriaSel);
		this.associado.setFormacao(this.formacaoSel);
		this.associado.setVisibilidadeTelefoneRes(this.visibilidadeTelRes);
		this.associado.setVisibilidadeTelefoneTrab(this.visibilidadeTelTrab);
		this.associado.setVisibilidadeCelular(this.visibilidadeCel);
		this.associado.setVisibilidadeEmail(this.visibilidadeEmail);
		this.associado.setVisibilidadeEndereco(this.visibilidadeEnd);
	}
	
	private void setVarAssociado() throws Exception {
		FacesContext context = FacesContext.getCurrentInstance();
		AtuaHandler atuaHandler = new AtuaHandler();
		atuaHandler.setAssociadoId(this.associado.getId());
		context.getExternalContext().getSessionMap().put("atuaHandler", atuaHandler);
		
		this.dataFormatada = this.associado.getNascimento();
		this.data = Convert.dateToString(this.dataFormatada);
		this.categoriaSel = formatInt(this.associado.getCategoria());
		this.formacaoSel = formatInt(this.associado.getFormacao());
		this.visibilidadeTelRes = this.associado.getVisibilidadeTelefoneRes();
		this.visibilidadeTelTrab = this.associado.getVisibilidadeTelefoneTrab();
		this.visibilidadeCel = this.associado.getVisibilidadeCelular();
		this.visibilidadeEmail = this.associado.getVisibilidadeEmail();
		this.visibilidadeEnd = this.associado.getVisibilidadeEndereco();
	}
	
	private int formatInt(Integer campo) {
		if(campo == null) return 1;
		return campo;
	}
	public int getMaxLinhas() {
		return maxLinhas;
	}
	public void setMaxLinhas(int maxLinhas) {
		this.maxLinhas = maxLinhas;
	}
	public boolean getEmEdicao() {
		return emEdicao;
	}
	public void setEmEdicao(boolean emEdicao) {
		this.emEdicao = emEdicao;
	}
	public boolean getEmNavegacao() {
		return !emEdicao;
	}
	public boolean getEmAlteracao() {
		if (this.associado == null) {
			return false;
		}
		if (this.associado.getId() == null) {
			return false;
		}
		return this.associado.getId() > 0;
	}
	
	public String getHtmlCabecalho(int pagina) {
		StringBuilder sb = new StringBuilder();
		if(pagina > 1) {
			sb.append(getHtmlLinha(null));
		}
		sb.append("		<table id=\"cabecalho\">\n");
		sb.append("		<thead>\n");
		sb.append("			<tr>\n");
		sb.append("				<td style=\"font-size: 24px; font-weight: bold; width: 205px;\">A M T  -  R J</td>\n");
		sb.append("				<td style=\"font-size: 18px; width: 820px;\">Relação de Associados</td>\n");
		sb.append("				<td>Página: " + Util.formatZeroLeft(pagina, 3) + "</td>\n");
		sb.append("			</tr>\n");
		sb.append("			<tr>");
		sb.append("				<td colspan=\"3\">Associação de Músico Terapêutas <br />do Rio de Janeiro</td>\n");
		sb.append("			</tr>\n");
		sb.append("			<tr><td colspan=\"3\"><hr /></td></tr>\n");
		sb.append("		</thead>\n");
		sb.append("	</table>\n");
		htmlTableIniciada = false;
		return sb.toString();
	}
	
	public String getHtmlLinha(Associado associado) {
		StringBuilder sb 	= new StringBuilder();
		if(associado != null) {
			if(!htmlTableIniciada) {
				htmlTableIniciada = true;
				sb.append("");
				sb.append("<table id='cabecalhoLinha'>");
				sb.append("	<thead>");
				sb.append("		<tr>");
				sb.append("		<th class='styDetalheTit' width='20px'>Id</th>");
				sb.append("		<th> </th>");
				sb.append("		<th class='styDetalheTit' width='320px'>Nome</th>");
				sb.append("		<th> </th>");
				sb.append("		<th class='styDetalheTit' width='50px'>No.Amt</th>");
				sb.append("		<th> </th>");
				sb.append("		<th class='styDetalheTit' width='75px'>CPF</th>");
				sb.append("		<th> </th>");
				sb.append("		<th class='styDetalheTit' width='260px'>Graduação</th>");
				sb.append("		<th> </th>");
				sb.append("		<th class='styDetalheTit' width='220px'>Bairro</th>");
				sb.append("		<th> </th>");
				sb.append("		<th class='styDetalheTit' width='85px'>Telefone</th>");
				sb.append("		</tr>");
				sb.append("	</thead>");
				sb.append("	<tbody>");
			}
			sb.append("		<tr>");
			sb.append("			<td>" + Util.formatZeroLeft(associado.getId(),5) + "</td>");
			sb.append("			<td> </td>");
			sb.append("			<td>" + associado.getNome() + "</td>");
			sb.append("			<td> </td>");
			sb.append("			<td>" + Util.formatZeroLeft(associado.getInscricaoAmt(),5) + "</td>");
			sb.append("			<td> </td>");
			cpf.setCpf(associado.getCpf());
			sb.append("			<td>" + cpf.getCpf() + "</td>");
			sb.append("			<td> </td>");
			sb.append("			<td>" + associado.getAreaGraduacao() + "</td>");
			sb.append("			<td> </td>");
			sb.append("			<td>" + associado.getBairro() + "</td>");
			sb.append("			<td> </td>");
			sb.append("			<td>");
			if(associado.getTelefoneRes() == null || associado.getTelefoneRes().trim().isEmpty()) {
				sb.append(associado.getTelefoneTrab());
			} else {
				sb.append(associado.getTelefoneRes());
			}
			sb.append("			</td>");
			sb.append("		</tr>");
		} else {
			htmlTableIniciada = false;
			sb.append("	</tbody>");
			sb.append("</table>");
		}
		return sb.toString();
	}
	
	public String getHtmlListaAssociados() {
		List<Associado> lista = associadoDAO.listar();
		StringBuilder sb 	= new StringBuilder();
		boolean temRegistro = true;
		int pagina 			= 0;
		int linhas 			= maxLinhas;
		
		Iterator<Associado> it = lista.iterator();
		while(temRegistro) {
			if(linhas >= maxLinhas) {
				sb.append(getHtmlCabecalho(++pagina));
				linhas = 0;
			}
			temRegistro = it.hasNext();
			if(temRegistro) {
				sb.append(getHtmlLinha(it.next()));
				linhas++;
			} else if(pagina == 1 && linhas == 0){
				sb.append("Não existem associados a serem listados");
			}
		}
		return sb.toString();
	}
}
